--[[
-- @Author: 671643387@qq.com
-- @Date: 2025-05-05 09:50
-- @Description: 太阳能锅炉控制
--]]

local component = require("component")
local text = require("text")
local serialization = require("serialization")
local sides = require("sides")
local oc_util = require("UTIL.oc_util")
local gpu = component.gpu

-- 开机信号强度
local OPEN_SIGNAL = 7

return {
    -- 红石方块地址
    redstone_address = nil,
    -- 红石方块
    redstone_proxy = nil,
    -- 开关发射面
    switch_side = nil,
    -- 运行状态
    running = false,

    -- 初始化
    init = function (self)
        -- 获取所有组件
        local components = oc_util.get_components()

        -- 读取保存的数据
        if not self:loaddata() then
            -- 获取连接的组件数量
            local size = oc_util.get_table_size(components)

            -- 选择红石方块
            repeat
                print("Select redstone block:")
                oc_util.print_itable(components, "  ")
                local i = oc_util.read_int()
                if i <= size then
                    self.redstone_address = oc_util.get_itable(components, i)
                end
            until self.redstone_address ~= nil and #self.redstone_address > 0

            -- 获取红石
            self.redstone_proxy = component.proxy(self.redstone_address)

            -- 选面表
            local sides_table = {
                ["front"] = sides.front,
                ["back"] = sides.back,
                ["left"] = sides.left,
                ["right"] = sides.right,
            }
            size = 4

            -- 清空信号
            oc_util.clear_redstone(self.redstone_proxy)

            -- 选择开关所在面
            repeat
                print("Select switch side:")
                oc_util.print_itable(sides_table, "  ")
                local i = oc_util.read_int()
                if i <= size then
                    _, self.switch_side = oc_util.get_itable(sides_table, i)
                end

                if self.switch_side ~= nil then
                    self.redstone_proxy.setOutput(self.switch_side, 15)
                    print("Is it right: (y/n)")
                    local anwser = oc_util.read_str()
                    self.redstone_proxy.setOutput(self.switch_side, 0)
                    if anwser == "y" then
                        break
                    end
                end
            until false

            -- 保存数据
            self:savedata()
        end

        -- 获取红石
        self.redstone_proxy = component.proxy(self.redstone_address)

        -- 清空信号
        oc_util.clear_redstone(self.redstone_proxy)
    end,

    -- 保存数据
    savedata = function (self)
        oc_util.save_file("./boiler.dat",
            serialization.serialize({self.redstone_address, self.switch_side}))
    end,

    -- 加载保存的数据
    loaddata = function (self)
        local data = oc_util.read_file("./boiler.dat")
        if data then
            local table = serialization.unserialize(data)
            if table then
                self.redstone_address = table[1]
                self.switch_side = table[2]
                return self.redstone_address
            end
        end
        return false
    end,

    -- 运行
    run = function (self)
        -- 横坐标偏移
        local x_offset = 1
        -- 纵坐标偏移
        local y_offset = 1

        -- 获取分辨率
        local width, height = gpu.getResolution()
        -- 清空背景
        gpu.setBackground(0x000000)
        gpu.fill(1, 1, width, height, " ")

        -- 显示动态信息
        while true do
            local solar_intensity = self.redstone_proxy.getInput(sides.top)

            if solar_intensity >= OPEN_SIGNAL and not self.running then
                self.running = true
                self.redstone_proxy.setOutput(self.switch_side, 15)
            elseif solar_intensity < OPEN_SIGNAL and self.running then
                self.running = false
                self.redstone_proxy.setOutput(self.switch_side, 0)
            end

            gpu.set(x_offset, y_offset, string.format("阳光强度：%s",
                text.padLeft(tostring(solar_intensity), 20)))
            gpu.set(x_offset, y_offset + 1, string.format("运行状态：%s",
                text.padLeft(tostring(self.running and "上线" or "下线"), 20)))

            local c, b = gpu.getBackground()
            local w = math.ceil((solar_intensity / 15) * width)
            gpu.setBackground(0xff0000)
            gpu.fill(1, height - 8 + 1, w, 8, " ")
            gpu.setBackground(0x000000)
            gpu.fill(w + 1, height - 8 + 1, width - w, 8, " ")
            gpu.setBackground(c, b)
        end
    end
}